diff options
Diffstat (limited to 'app/api/data-room/[projectId]/[fileId]/route.ts')
| -rw-r--r-- | app/api/data-room/[projectId]/[fileId]/route.ts | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/app/api/data-room/[projectId]/[fileId]/route.ts b/app/api/data-room/[projectId]/[fileId]/route.ts new file mode 100644 index 00000000..176aaf63 --- /dev/null +++ b/app/api/data-room/[projectId]/[fileId]/route.ts @@ -0,0 +1,147 @@ +// app/api/files/[projectId]/[fileId]/route.ts +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth/next'; +import { authOptions } from '@/app/api/auth/[...nextauth]/route' +import { FileService, type FileAccessContext } from '@/lib/services/fileService'; + +// 파일 정보 조회 +export async function GET( + request: NextRequest, + { params }: { params: { projectId: string; fileId: string } } +) { + try { + const session = await getServerSession(authOptions); + if (!session?.user) { + return NextResponse.json({ error: '인증이 필요합니다' }, { status: 401 }); + } + + const context: FileAccessContext = { + userId: session.user.id, + userDomain: session.user.domain || 'partners', + userEmail: session.user.email, + ipAddress: request.ip || request.headers.get('x-forwarded-for') || undefined, + userAgent: request.headers.get('user-agent') || undefined, + }; + + const fileService = new FileService(); + const hasAccess = await fileService.checkFileAccess( + params.fileId, + context, + 'view' + ); + + if (!hasAccess) { + return NextResponse.json( + { error: '파일 접근 권한이 없습니다' }, + { status: 403 } + ); + } + + // 파일 정보 반환 + const file = await fileService.downloadFile(params.fileId, context); + + if (!file) { + return NextResponse.json( + { error: '파일을 찾을 수 없습니다' }, + { status: 404 } + ); + } + + return NextResponse.json(file); + } catch (error) { + console.error('파일 조회 오류:', error); + return NextResponse.json( + { error: '파일 조회에 실패했습니다' }, + { status: 500 } + ); + } +} + +// 파일 수정 +export async function PATCH( + request: NextRequest, + { params }: { params: { projectId: string; fileId: string } } +) { + try { + const session = await getServerSession(authOptions); + if (!session?.user) { + return NextResponse.json({ error: '인증이 필요합니다' }, { status: 401 }); + } + + const context: FileAccessContext = { + userId: session.user.id, + userDomain: session.user.domain || 'partners', + userEmail: session.user.email, + ipAddress: request.ip || request.headers.get('x-forwarded-for') || undefined, + userAgent: request.headers.get('user-agent') || undefined, + }; + + const fileService = new FileService(); + const hasAccess = await fileService.checkFileAccess( + params.fileId, + context, + 'edit' + ); + + if (!hasAccess) { + return NextResponse.json( + { error: '파일 수정 권한이 없습니다' }, + { status: 403 } + ); + } + + const body = await request.json(); + + // 파일 이동 처리 + if (body.parentId !== undefined) { + await fileService.moveFile(params.fileId, body.parentId, context); + } + + return NextResponse.json({ success: true }); + } catch (error) { + console.error('파일 수정 오류:', error); + return NextResponse.json( + { error: '파일 수정에 실패했습니다' }, + { status: 500 } + ); + } +} + +// 파일 삭제 +export async function DELETE( + request: NextRequest, + { params }: { params: { projectId: string; fileId: string } } +) { + try { + const session = await getServerSession(authOptions); + if (!session?.user) { + return NextResponse.json({ error: '인증이 필요합니다' }, { status: 401 }); + } + + const context: FileAccessContext = { + userId: session.user.id, + userDomain: session.user.domain || 'partners', + userEmail: session.user.email, + ipAddress: request.ip || request.headers.get('x-forwarded-for') || undefined, + userAgent: request.headers.get('user-agent') || undefined, + }; + + const fileService = new FileService(); + await fileService.deleteFile(params.fileId, context); + + return NextResponse.json({ success: true }); + } catch (error) { + if (error instanceof Error && error.message.includes('권한')) { + return NextResponse.json( + { error: error.message }, + { status: 403 } + ); + } + + console.error('파일 삭제 오류:', error); + return NextResponse.json( + { error: '파일 삭제에 실패했습니다' }, + { status: 500 } + ); + } +}
\ No newline at end of file |
